package main

import (
	"fmt"
)

func main() {
	// 一.完成棋盘初始化，二维数组初始化
	const LEN int = 11
	var chessArr1 [LEN][LEN]int // go语言数组长度是不可变的，所以只能使用常量修饰的变量
	chessArr1[1][2] = 1         // 添加白棋子
	chessArr1[2][3] = 2         // 添加黑棋子
	fmt.Println("棋盘")
	fmt.Println(chessArr1)

	// 二.二维数组转换成稀疏数组
	// 1.先遍历二维数组，得到非0数据的个数
	var nonZero []int
	for i := 0; i < len(chessArr1); i++ {
		for j := 0; j < len(chessArr1[i]); j++ {
			if chessArr1[i][j] != 0 {
				nonZero = append(nonZero, chessArr1[i][j])
			}
		}
	}

	fmt.Println("有效数据个数")
	fmt.Println(len(nonZero))

	// 2.创建对应的稀疏数组
	var sparseArr [][]int // 个数是可变的，这里用切片

	// 记录棋盘大小，棋子个数
	// 行数，列数，有效值个数
	sparseArr = append(sparseArr, []int{LEN, LEN, len(nonZero)})

	// 记录棋子位置信息及值
	for i := 0; i < len(chessArr1); i++ {
		for j := 0; j < len(chessArr1[i]); j++ {
			if chessArr1[i][j] != 0 {
				sparseArr = append(sparseArr, []int{i, j, chessArr1[i][j]})
			}
		}
	}
	fmt.Println("稀疏数组")
	fmt.Println(sparseArr)

	
	// 三。将稀疏数组恢复成二维数组
	var row int = sparseArr[0][0]
	var col int = sparseArr[0][1]
	var chessArr2 [][]int
	// 1.读取记录棋盘大小，初始化棋盘
	for i := 0; i < row; i++ {
		var arr []int
		for j := 0; j < col; j++ {
			arr = append(arr, 0)
		}
		chessArr2 = append(chessArr2, arr)
	}
	for i := 1; i < len(sparseArr); i++ {
		chessArr2[sparseArr[i][0]][sparseArr[i][1]] = sparseArr[i][2]
	}
	fmt.Println("原始棋盘");
	fmt.Println(chessArr2)
}
